package com.pointtown.vcrss.activity;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicBoolean;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.TextView;
import android.widget.Toast;

import com.pointtown.vcrss.R;
import com.pointtown.vcrss.common.Const;
import com.pointtown.vcrss.common.HttpManager;
import com.pointtown.vcrss.common.XmlManager;
import com.pointtown.vcrss.database.Entry;
import com.pointtown.vcrss.database.RSSTabeleDAO;

public class MainActivity extends Activity {

	private TextView text;
	private RSSReaderAsyncTask task;
	private String TAG = "MainActivity";

	SharedPreferences pref;  
	SharedPreferences.Editor editor; 
	  
	// 取得ボタン：スレッドのスタートを監視
	private static AtomicBoolean running = new AtomicBoolean(false);
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        //タイトルバーにインジケータを表示させる
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        
        setContentView(R.layout.main);
                
        
        text = (TextView)findViewById(R.id.TextView01);
        text.setText("ベジコレチーム");
        
        /*
        SharedPrefernces の取得  
		MODE_WORLD_READABLE：他のアプリから読み取り可能
		MODE_WORLD_WRITEABLE：他のアプリから書込み可能
		MODE_PRIVATE：そのアプリケーションだけで使用可能
         */
        pref = getSharedPreferences(Const.PREF_KEY, Activity.MODE_PRIVATE); 

    }
//
//    @Override
//    public boolean onCreateOptionsMenu(Menu menu) {
//        getMenuInflater().inflate(R.menu.main, menu);
//        return true;
//    }
    
    public void onClickGetRssButton(View view) {
    	
    	Log.v(TAG, "onClickRssButton");
    	
	
    	Toast.makeText(getApplicationContext(), "RSS取得中", Toast.LENGTH_SHORT).show();
    	
		//runnigフラグチェック
    	if (!running.get()) {
    		//runnigフラグの変更
	    	running.set(true);
	        //AsyncTaskを実行する
	        task = new RSSReaderAsyncTask();
	        task.execute("RSSReader as doInBackground"); 
    	}
    }
    
    public void onClickListButton(View view) {
    	
    	Log.v(TAG, "onClickListButton");
    	
    	//DBからデータ取得
    	RSSTabeleDAO dao = new RSSTabeleDAO(this);
    	//ArrayList<Entry> list = dao.getAllEntries();
    	if (dao.getEntryCount() > 0) {
    		Intent intent = new Intent(this, ListActivity.class);
    		startActivity(intent);
    	} else {
    		Toast.makeText(this, "取得ボタンをクリックしてね★", Toast.LENGTH_SHORT).show();
    	}
    	
    }
    
    
	/**
	 * read RSS Data and insert DB
	 */
    class RSSReaderAsyncTask extends AsyncTask<String, Integer, Boolean> {


		@Override
		protected void onPreExecute() {
			//PreExecuteではHandlerを使わずにUIを操作することができる
			//インジケータを表示する
			setProgressBarIndeterminateVisibility(true);
		}

		@Override
		protected Boolean doInBackground(String... params) {
			Log.v("RSSReaderAsyncTask", "params:" + params[0]);
			//URLたたいてRSSを取得
			InputStream is = HttpManager.getXml();
			if (is == null) return false;
			HashMap<String, Object> map = XmlManager.parseXml(is);
			if (map == null) return false;
			if (map.get(Const.ENTRY_LIST_KEY) == null 
					|| map.get(Const.LAST_BUILD_DATE_KEY) == null
					|| map.get(Const.LAST_BUILD_DATE_KEY).equals(""))
				return false;
			//DBにつっこむ
			long cnt = insertDB(map);
			if (cnt == 0)
				return false;
			return true;
		}

		private long insertDB(HashMap<String, Object> map) {
			ArrayList<Entry> entryList = (ArrayList<Entry>)map.get(Const.ENTRY_LIST_KEY);
			String last_build_date = (String)map.get(Const.LAST_BUILD_DATE_KEY);
			String lastBuildDateInPref = pref.getString(Const.KEY_LAST_BUILD, "");
			String lastEntryDateInPref = pref.getString(Const.KEY_LAST_ENTRY, "");
			long cnt = -1;
	    	RSSTabeleDAO dao = new RSSTabeleDAO(getApplicationContext());
	    	//DBにつっこむ
			if (lastBuildDateInPref.equals("") || lastEntryDateInPref.equals("")) {
				//初期化して、insert
				//dao.delteAllEntries();
				cnt = dao.insertEntries(entryList);
			} else if (!last_build_date.equals(lastBuildDateInPref) && !lastEntryDateInPref.equals("")) {
				ArrayList<Entry> newEntryList = new ArrayList<Entry>();
	    		for (Entry entry : entryList) {
	    			if (entry.getPubDate().equals(lastEntryDateInPref))
	    				break;
	    			else
	    				newEntryList.add(entry);
	    		}
	    		
	    		if (!newEntryList.isEmpty())
	    			cnt = dao.insertEntries(newEntryList);
	    	} 
			
			// Editor の設定  
			editor = pref.edit();  
			// Editor に値を代入  
			editor.putString(Const.KEY_LAST_BUILD, last_build_date); 
			//最新の記事のDATEをSharedPreferncesに保存
			if (entryList.get(0) != null && entryList.get(0).getPubDate() != null)
				editor.putString(Const.KEY_LAST_ENTRY, entryList.get(0).getPubDate());  
			// データの保存  
			editor.commit(); 
			return cnt;
		}

		@Override
		protected void onPostExecute(Boolean result) {
			//onPostExecuteではHandlerを使わずにUIを操作することができる
			if(result){
				Toast.makeText(getApplicationContext(), "取得完了しました", Toast.LENGTH_SHORT).show();
			}else{
				Toast.makeText(getApplicationContext(), "残念", Toast.LENGTH_SHORT).show();
			}

			//インジケータを非表示にする
			setProgressBarIndeterminateVisibility(false);
			running.set(false);
		}

		@Override
		protected void onCancelled() {
			//インジケータを非表示にする
			setProgressBarIndeterminateVisibility(false);
			//TextViewに中止を設定
			text.setText("中止");
			running.set(false);
		}
    }
    
    @Override
	protected void onDestroy() {  
		super.onDestroy();
		if(task != null)
		task.cancel(false);//doInBackground()が終わるまで待つ
	}
}
